/**
 *原理：
  原理同强引用散列表
   WeakMap是一种弱引用散列表， 这意味着,如果没有其他引用和该键引用同一个对象,这个对象将会被当作垃圾回收掉。解决了内存泄露的问题。

   优点：方法getName存在于prototype上，被所有实例共享，内存会回收
 * @param {*} name  以一个name属性为例
 * @returns
 */
let Person = (function () {
  // 定义一个对象保存对应关系
  let privateData = new WeakMap();

  function Person(name) {
    // 然后将值放置存储对象,map属性可以是对象
    privateData.set(this, { name: name });
  }

  Person.prototype.getName = function () {
    // 取值需要通过特殊标记去存储对象中取，这样外面无法直接获取到
    return privateData.get(this).name;
  };

  return Person;
})();

// 类的写发
let Person1 = (function () {
  const _wm = new WeakMap();
  return class Person {
    constructor(name, age) {
      _wm.set(this, { name, age });
    }
    get(key) {
      return _wm.get(this)[key];
    }
  };
})();

let p = new Person("kele");
console.log("[ p.getName() ] >", p.getName());
let p2 = new Person1("kele", 1);
console.log("[ p.getName() ] >", p2.get("name"));
